import { makeHTTPSAvatar } from '@/lib/https'
import { API } from '@/services/common/api'

export const TOKEN_KEY = 'token'

/**
 * 授权登录方式
 */
export enum AuthMethod {
  apps = 'apps', // 流量超市登录
  internal = 'internal', // 内部用户名密码登录
}

/**
 * 账号基本信息
 */
export interface BaseAccount {
  id: string
  name: string
  avatar: string // 可能为空字符串
  remark: string
}

/**
 * 已登录账号的详细信息
 */
export interface Account {
  id: string // 应用内通用的 id（加了 AuthMethod 前缀）
  rawId: number // 原始账号 id
  parentId: string | null // 主账号 ID（加了 AuthMethod 前缀），为 null 代表当前就是主账号
  rawParentId: number | null // 主账号原始 ID，为 null 代表当前就是主账号
  name: string
  avatar: string
  remark: string
  phone: string
  token: string
  isAdmin: boolean // 是否有管理员权限（此为一个快捷方式，对应 permissions 里包含 Permission.Admin）
  isSuperAdmin: boolean // 是否是超级管理员。超级管理员能给予、取消其他用户的管理员权限。isSuperAdmin 为 true 时，isAdmin 一定为 true
  permissions: Permission[]
  method: AuthMethod
}

/**
 * 登录状态
 */
export enum LoginStatus {
  NeedConfirm = 'NeedConfirm', // 待确认
  NotLoggedIn = 'NotLoggedIn', // 未登录
  LoggedIn = 'LoggedIn', // 已登录
  LoginFailed = 'LoginFailed', // 登录失败
}
export type NotLoggedIn = {
  status: LoginStatus.NotLoggedIn
  message?: string // 进入未登录状态时带上的提示信息
}
export type LoggedIn = {
  status: LoginStatus.LoggedIn
  account: Account
}
export type LoginFailed = {
  status: LoginStatus.LoginFailed
  message: string
}
export type LoginInfo = { status: LoginStatus.NeedConfirm } | NotLoggedIn | LoggedIn | LoginFailed

/**
 * 用户权限定义（管理员自动拥有全部权限）
 */
export enum Permission {
  AnyTransfer = 1, // 允许将任意客户转交给任意人
  Admin = 2, // 是否有管理员权限（超级管理员不通过此值判断）
}

/**
 * 获取账号信息（同时可确认 token 是否有效、及是否有使用权限）
 */
export async function getAccount(token: string) {
  return API('/User/GetUserInfo', {
    ignoreUnauthorized: true,
    headers: { token },
    formatter(raw: RespAccount): Account {
      return formatRespAccount(raw, token)
    },
  })
}
interface RespAccount {
  UserId: string // 用户 ID，带 AuthMethod 前缀
  ParentUserId: string // 用户所属主账号 ID，带 AuthMethod 前缀。若与 UserId 相同，说明当前就是主账号。
  UserName: string
  Avatar?: string
  IsAdmin: boolean
  Permissions: Permission[]
  TokenFrom: 0 | 1 // 0 代表流量超市账号；1 代表用户名密码登录账号
  Phone?: string | null // 手机号（如果有的话）
}
function formatRespAccount(raw: RespAccount, token: string): Account {
  const userId = parseInt(raw.UserId.split('-')[1] ?? '0', 10)
  const parentUserId = parseInt(raw.ParentUserId.split('-')[1] ?? '0', 10)
  return {
    id: raw.UserId,
    rawId: userId,
    parentId: parentUserId === userId ? null : raw.ParentUserId,
    rawParentId: parentUserId === userId ? null : parentUserId,
    name: raw.UserName,
    avatar: makeHTTPSAvatar(raw.Avatar ?? ''),
    remark: '', // TODO: 目前 /User/GetUserInfo 接口未返回 Remark 字段，之后要补一下
    phone: raw.Phone ?? '',
    token,
    isAdmin: raw.IsAdmin || raw.Permissions.includes(Permission.Admin),
    isSuperAdmin: raw.IsAdmin,
    permissions: raw.Permissions,
    method: raw.TokenFrom === 0 ? AuthMethod.apps : AuthMethod.internal,
  }
}
